
import java.util.Date;
import java.util.logging.Logger;
import src.de.checker.hochzeit.domain.util.*;
import src.de.checker.hochzeit.domain.user.*;
import src.de.checker.hochzeit.domain.picture.*;
import src.de.checker.hochzeit.konstanten.*
import src.de.checker.hochzeit.util.*;
import com.google.appengine.api.datastore.*
import com.google.appengine.api.blobstore.BlobKey
import static com.google.appengine.api.datastore.FetchOptions.Builder.*
/**
 * Verwaltet die Funktionen, die für das Verwalten von Fotoalben benötigt werden.
 */
Logger log = Logger.getLogger('AlbumController');

def myuser = session.getAttribute(Konstanten.SESSION_USER);

if(myuser != null)
{
	if(params?.index ==~ /(?i)true/)
	{
		index()
	}
	if(params?.save ==~ /(?i)true/)
	{
		save()
	}
	if(params?.delete ==~ /(?i)true/)
	{
		delete()
	}
	if(params?.edit ==~ /(?i)true/)
	{
		edit()
	}
	if(params?.update ==~ /(?i)true/)
	{
		update()
	}
}

private void index()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	//Alle bereits gespeicherten Albem für die Feier suchen
	def query = new Query(Konstanten.ALBUM)
	query.addFilter("feier", Query.FilterOperator.EQUAL, feier)
	PreparedQuery preparedQuery = datastore.prepare(query)
 	def entities = preparedQuery.asList( withLimit(30) )
 	
 	Map anzahl = new HashMap();
 	for(album in entities) {
 		def query1 = new Query(Konstanten.PICTURE)
 		query1.addFilter("feier", Query.FilterOperator.EQUAL, feier)
 		query1.addFilter("album", Query.FilterOperator.EQUAL, album.key)
 		PreparedQuery preparedQuery1 = datastore.prepare(query1)
 	 	int counter = preparedQuery1.countEntities()
 	 	anzahl.put(album.key, counter)
 	}
 	//System.out.println(anzahl)
 	request['list'] = entities
 	request['anzahl'] = anzahl
 	
 	forward '/album/index.gtpl'
}

/**
 * Speichert eine Location für die Feier des
 * angemeldeten Benutzers
 */
private void save()
{
	if(!params.name)
	{
		request.message = 'Bitte Namen angeben'
		forward '/album/index.gtpl'
	}
	else
	{
		if(!params.anmerkung)
			params.anmerkung = ''
		def myuser = session.getAttribute(Konstanten.SESSION_USER);
		Album l = new Album()
		l.name = params.name
		l.anmerkung = params.anmerkung
		l.eingestelltVon = myuser.key
		l.eingestelltAm = Datehelper.getNow()
		l.feier = myuser.feier
		
		Entity e = l as Entity
		e.save()
		
		createTracer(Konstanten.TRACER_CREATE, "Neues Album eingestellt - "+params.name)
		request.message = 'Album '+params.name+' erstellt'
		
		index()
	}
}
private void edit() {
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	try {
		
		Key albumkey = KeyFactory.stringToKey(params.key)
		def album = datastore.get(albumkey);
		if(album.feier.equals(myuser.feier) )
		{
			def query1 = new Query(Konstanten.PICTURE)
			query1.addFilter("album", Query.FilterOperator.EQUAL, albumkey)
			PreparedQuery preparedQuery1 = datastore.prepare(query1)
		 	int counter = preparedQuery1.countEntities()
			 	
			request['album'] = album
			request['anzahl'] = counter
			forward '/album/edit.gtpl'
		} else {
			String message = 'Es wurde ein Album zu editieren, das nicht dem Benutzer gehört. params.key: '+params.key 
			log.warning(message + " Benutzer der gesucht hat: "+myuser+" Params: "+params)
			createTracer(Konstanten.TRACER_VERBOTEN, message)
			index()
		}
		
	} catch(Exception e) {
		String message = 'Es wurde ein Album zu editieren, das es nicht gibt. params.key: '+params.key 
		log.warning(e.toString())
		log.warning(message + " Benutzer der gesucht hat: "+myuser+" Params: "+params)
		createTracer(Konstanten.TRACER_VERBOTEN, message)
		index()
	}
	
}
private void update()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	if(!params.name)
	{
		request.message = 'Bitte Namen angeben'
		forward '/album/edit.gtpl'
	}
	else
	{
		
		try {
			Key albumkey = KeyFactory.stringToKey(params.key)
			def album = datastore.get(albumkey);
			if(album.feier.equals(myuser.feier) )
			{
				String oldname = album.name
				
				if(!params.anmerkung)
					params.anmerkung = ''
						
				album.name = params.name
				album.anmerkung = params.anmerkung
				
				album.save()
				
				String message = 'Album ' + oldname + ' aktualisiert '
				createTracer(Konstanten.TRACER_CREATE, message)
				request.message = message
			} else {
				String message = 'Es wurde ein Album zu updaten, das nicht dem Benutzer gehört. params.key: '+params.key 
				log.warning(message + " Benutzer der gesucht hat: "+myuser+" Params: "+params)
				createTracer(Konstanten.TRACER_VERBOTEN, message)
			}
		} catch(Exception e) {
			String message = 'Es wurde ein Album zu updaten, das es nicht gibt. params.key: '+params.key 
			log.warning(e.toString())
			log.warning(message + " Benutzer der gesucht hat: "+myuser+" Params: "+params)
			createTracer(Konstanten.TRACER_VERBOTEN, message)
		}
		
		index()
	}
}
private void delete() {
	def myuser = session.getAttribute(Konstanten.SESSION_USER);
	String feier = myuser.feier
	
	try {
		Key albumkey = KeyFactory.stringToKey(params.key)
		def album = datastore.get(albumkey);
		
		if(album.feier.equals(myuser.feier) )
		{
			def query = new Query(Konstanten.PICTURE)
			query.addFilter("feier", Query.FilterOperator.EQUAL, feier)
			query.addFilter("album", Query.FilterOperator.EQUAL, albumkey)
			PreparedQuery preparedQuery = datastore.prepare(query)
		 	def entities = preparedQuery.asList(withLimit(300))
		 	for( i in entities) {
		 		def blob = new BlobKey(i.blobKey)
		 		blob.delete()
		 		i.delete()
		 	}
			String message = 'Album ' + album.name + ' erfolgreich gelöscht'
		 	createTracer(Konstanten.TRACER_DELETE, message)
			
		 	album.delete()
			
		 	request.message = message
		} else {
			String message = 'Es wurde ein Album zu löschen, das nicht dem Benutzer gehört. params.key: '+params.key 
			log.warning(message + " Benutzer der gesucht hat: "+myuser+" Params: "+params)
			createTracer(Konstanten.TRACER_VERBOTEN, message)
		}
	 	
	} catch(Exception e) {
		String message = 'Es wurde ein Album zu löschen, das es nicht gibt. params.key: '+params.key 
		log.warning(e.toString())
		log.warning(message + " Benutzer der gesucht hat: "+myuser+" Params: "+params)
		createTracer(Konstanten.TRACER_VERBOTEN, message)
	}
	index()
}

private void createTracer(String type, String message) {
	try {
		def myuser = session.getAttribute(Konstanten.SESSION_USER);

		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = myuser.key
	    t.type = type
	    t.nachricht = message
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	} catch(Exception e) {
	}
}

